﻿using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Core.Business.Domain.Repository;
using Moq;
using Core.Business.Domain.Entities;
using ControleFinanceiro.Web.Controllers;
using System.Web.Mvc;

namespace ControleFinanceiro.Tests.Controller {
    [TestClass]
    public class CategoriaControllerTest {

        private Mock<ICategoriaRepository> _categoriaRepositoryMock;
        private ICategoriaRepository _categoriaRepository;

        [TestInitialize]
        public void Initialize() {
            _categoriaRepositoryMock = new Mock<ICategoriaRepository>();
            _categoriaRepositoryMock.Setup(m => m.GetAll())
                                    .Returns(GetCategorias());            

            _categoriaRepository = _categoriaRepositoryMock.Object;
        }

        [TestCleanup]
        public void Cleanup() {

        }

        [TestMethod]
        public void Deve_retornar_uma_lista_de_categorias_e_suas_subcategorias() {

            var controller = new CategoriaController(_categoriaRepository);

            JsonResult result = controller.GetCategorias() as JsonResult;

            List<object> categorias = (List<object>)result.Data;
            Assert.IsTrue(categorias.Count() > 0);
        }

        [TestMethod]
        public void Deve_adicionar_uma_categoria_e_retornar_o_id() {
            Categoria categoria = new Categoria("Transporte");
            _categoriaRepositoryMock.Setup(m => m.AddCategoria(categoria));

            var controller = new CategoriaController(_categoriaRepository);

            ViewResult result = controller.AddCategoria("Transporte") as ViewResult;

            categoria = result.ViewData.Model as Categoria;
            _categoriaRepositoryMock.Verify(m => m.AddCategoria(categoria));
        }

        private List<Categoria> GetCategorias() {
            var list = new List<Categoria>();

            Categoria categoria = new Categoria("Transporte");
            categoria.AddSubCategoria("Combustível");
            categoria.AddSubCategoria("Mecânico");
            list.Add(categoria);

            categoria = new Categoria("Alimentação");
            categoria.AddSubCategoria("Mercado");
            list.Add(categoria);

            categoria = new Categoria("Cultura");
            categoria.AddSubCategoria("Livros e revistas");
            categoria.AddSubCategoria("Teatro");
            list.Add(categoria);

            return list;
        }
    }
}
